#include <iostream>
#include <random>
#include <string>
#include <vector>
#include <sstream>
#include <chrono>
#include <iomanip>
#include <atomic>

#include <fstream>
#include <stdexcept>






// UUID
// 8个16进制的随机数+4位mac地址+12位原子递增数字
class UUIDHelp
{
public:
    static std::string get_mac_address()
    {
        std::ifstream file("/sys/class/net/eth0/address"); // 根据实际网络接口名称替换 eth0
        if (!file.is_open())
        {
            throw std::runtime_error("Failed to open MAC address file");
        }

        std::string mac_address;
        std::getline(file, mac_address);

        return mac_address;
    }

    static std::string uuid()
    {
        std::random_device rd;
        std::mt19937_64 generator(rd()); // 梅森旋转算法,以硬件随机为种子
        // 生成8个0~255的数字
        std::uniform_int_distribution<int> distribution(0, 255); // 截取8位

        // 流提取成俩位的十进制
        std::stringstream ss;

        // 生成 8 4 4
        for (int i = 1; i <= 8; i++)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
            if (i == 4 || i == 6 || i == 8)
                ss << "-";
        }
        // 追加上mac地址后四位
        std::string mac_address = UUIDHelp::get_mac_address().substr(0, 5);
        ss << mac_address << "-";

        static std::atomic<int> atc(1);
        int num = atc.fetch_add(1);
        for (int i = 5; i >= 0; i--)
            ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i * 6) & 0xff);

        return ss.str();
    }
};

int main()
{
    for(int i=0;i<10;i++)
        std::cout<<UUIDHelp::uuid()<<std::endl;
    return 0;
}